package br.com.medvagas.web.mb.p;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.apache.commons.lang.StringUtils;

import br.com.medvagas.comum.entidade.EsperienciaProfissional;
import br.com.medvagas.comum.entidade.FormacaoAcademicaTitulacao;
import br.com.medvagas.comum.entidade.FormacaoComplementar;
import br.com.medvagas.comum.entidade.LinguaEstrangeira;
import br.com.medvagas.comum.entidade.Municipio;
import br.com.medvagas.comum.entidade.Pais;
import br.com.medvagas.comum.entidade.ParticipacaoEvento;
import br.com.medvagas.comum.entidade.Uf;
import br.com.medvagas.comum.entidade.UsuarioProfissional;
import br.com.medvagas.comum.enumeracao.vaga.NivelFormacaoEnum;
import br.com.medvagas.comum.util.CacheSelectItem;
import br.com.medvagas.comum.util.UtilJSF;
import br.com.medvagas.comum.util.UtilSpring;
import br.com.medvagas.negocio.facade.p.IManterProfissional;

@ManagedBean
@ViewScoped
public class CadastrarCurriculoMB implements Serializable {
	private static final long serialVersionUID = 1L;

	private FormacaoAcademicaTitulacao formacaoAcademica;
	private FormacaoComplementar formacaoComplementar;
	private ParticipacaoEvento participacaoEvento;
	private EsperienciaProfissional esperienciaProfissional;
	private LinguaEstrangeira linguaEstrangeira;

	private List<FormacaoAcademicaTitulacao> lsFormacaoAcademica;
	private List<FormacaoComplementar> lsFormacaoComplementar;
	private List<ParticipacaoEvento> lsParticipacaoEvento;
	private List<EsperienciaProfissional> lsEsperienciaProfissional;
	private List<LinguaEstrangeira> lsLinguaEstrangeira;

	private Boolean conhecimentoMsexcel;
	private Boolean conhecimentoMspowerpoint;
	private Boolean conhecimentoMsword;
	
	private List<SelectItem> lsPais;
	private List<SelectItem> lsUf;
	private List<SelectItem> lsMunicipio;
	private List<SelectItem> lsMunicipioFc;
	private List<SelectItem> lsMunicipioPe;
	private List<SelectItem> lsMunicipioEp;

	private Integer idUsuarioProfissional;

	private boolean sucessoAddFormacaoAcademica;
	private boolean sucessoAddFormacaoComplementar;
	private boolean sucessoAddParticipacaoEvento;
	private boolean sucessoAddEsperienciaProfissional;
	private boolean sucessoAddLinguaEstrangeira;
	
	private String emOutros;
	
	public CadastrarCurriculoMB() {
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		UsuarioProfissional upSessao = UtilJSF.getUsuarioProfissionalLogado();
		this.idUsuarioProfissional = upSessao.getIdUsuarioProfissional();
		UsuarioProfissional up = mp.consultarCurriculo(idUsuarioProfissional);
		// up = new UsuarioProfissional();
		Set<FormacaoAcademicaTitulacao> stFormacaoAcademica = up.getStFormacaoAcademicaTitulacao();
		if (stFormacaoAcademica != null && !stFormacaoAcademica.isEmpty()) {
			lsFormacaoAcademica = new ArrayList<FormacaoAcademicaTitulacao>(stFormacaoAcademica.size());
			for (FormacaoAcademicaTitulacao fa : stFormacaoAcademica) {
				lsFormacaoAcademica.add(fa);
			}
		}

		Set<FormacaoComplementar> stFormacaoComplementar = up.getStFormacaoComplementar();
		if (stFormacaoComplementar != null && !stFormacaoComplementar.isEmpty()) {
			lsFormacaoComplementar = new ArrayList<FormacaoComplementar>(stFormacaoComplementar.size());
			for (FormacaoComplementar fc : stFormacaoComplementar) {
				lsFormacaoComplementar.add(fc);
			}
		}

		Set<ParticipacaoEvento> stParticipacaoEvento = up.getStParticipacaoEvento();
		if (stParticipacaoEvento != null && !stParticipacaoEvento.isEmpty()) {
			lsParticipacaoEvento = new ArrayList<ParticipacaoEvento>(stParticipacaoEvento.size());
			for (ParticipacaoEvento pe : stParticipacaoEvento) {
				lsParticipacaoEvento.add(pe);
			}
		}

		Set<LinguaEstrangeira> stLinguaEstrangeira = up.getStLinguaEstrangeira();
		if (stLinguaEstrangeira != null && !stLinguaEstrangeira.isEmpty()) {
			lsLinguaEstrangeira = new ArrayList<LinguaEstrangeira>(stLinguaEstrangeira.size());
			for (LinguaEstrangeira le : stLinguaEstrangeira) {
				lsLinguaEstrangeira.add(le);
			}
		}

		Set<EsperienciaProfissional> stEsperienciaProfissional = up.getStEsperienciaProfissional();
		if (stEsperienciaProfissional != null && !stEsperienciaProfissional.isEmpty()) {
			lsEsperienciaProfissional = new ArrayList<EsperienciaProfissional>(stEsperienciaProfissional.size());
			for (EsperienciaProfissional ep : stEsperienciaProfissional) {
				lsEsperienciaProfissional.add(ep);
			}
		}

		formacaoAcademica = new FormacaoAcademicaTitulacao();
		formacaoComplementar = new FormacaoComplementar();
		participacaoEvento = new ParticipacaoEvento();
		esperienciaProfissional = new EsperienciaProfissional();
		linguaEstrangeira = new LinguaEstrangeira();
		
		conhecimentoMsexcel = up.getConhecimentoMsexcel();
		conhecimentoMspowerpoint = up.getConhecimentoMspowerpoint();
		conhecimentoMsword = up.getConhecimentoMsword();
		
		lsPais = CacheSelectItem.get(Pais.class.getName());
		lsUf = CacheSelectItem.get(Uf.class.getName());
		lsMunicipio = Collections.emptyList();
		lsMunicipioFc = Collections.emptyList();
		lsMunicipioPe = Collections.emptyList();
		lsMunicipioEp = Collections.emptyList();
	}

	public void onchangeEstadoFormacaoAcademica(AjaxBehaviorEvent event) {
		if (StringUtils.isNotEmpty(formacaoAcademica.getSiglaUf())) {
			lsMunicipio = CacheSelectItem.get(formacaoAcademica.getSiglaUf() + Municipio.class.getName());
		} else {
			formacaoAcademica.setCodIbge(null);
			lsMunicipio = Collections.emptyList();
		}
	}
	public void onchangeEstadoFormacaoComplementar(AjaxBehaviorEvent event) {
		if (StringUtils.isNotEmpty(formacaoComplementar.getSiglaUf())) {
			lsMunicipioFc = CacheSelectItem.get(formacaoComplementar.getSiglaUf() + Municipio.class.getName());
		} else {
			formacaoComplementar.setCodIbge(null);
			lsMunicipioFc = Collections.emptyList();
		}
	}
	public void onchangeEstadoParticipacaoEvento(AjaxBehaviorEvent event) {
		if (StringUtils.isNotEmpty(participacaoEvento.getSiglaUf())) {
			lsMunicipioPe = CacheSelectItem.get(participacaoEvento.getSiglaUf() + Municipio.class.getName());
		} else {
			participacaoEvento.setCodIbge(null);
			lsMunicipioPe = Collections.emptyList();
		}
	}
	public void onchangeEstadoEsperienciaProfissional(AjaxBehaviorEvent event) {
		if (StringUtils.isNotEmpty(esperienciaProfissional.getSiglaUf())) {
			lsMunicipioEp = CacheSelectItem.get(esperienciaProfissional.getSiglaUf() + Municipio.class.getName());
		} else {
			esperienciaProfissional.setCodIbge(null);
			lsMunicipioEp = Collections.emptyList();
		}
	}
	
	public void limparResultValidacao(AjaxBehaviorEvent event) {
		sucessoAddFormacaoAcademica = false;
	}
	public void limparResultValidacaoFc(AjaxBehaviorEvent event) {
		sucessoAddFormacaoComplementar = false;
	}
	public void limparResultValidacaoEp(AjaxBehaviorEvent event) {
		sucessoAddEsperienciaProfissional = false;
	}

	public void addFormacaoAcademica() {
		if (NivelFormacaoEnum.ENSINO_MEDIO.getValor().equals(formacaoAcademica.getNivel())
				|| NivelFormacaoEnum.ENSINO_FUNDAMENTAL.getValor().equals(formacaoAcademica.getNivel())) {
			formacaoAcademica.setEm(null);
		} else if (!NivelFormacaoEnum.GRADUACAO.getValor().equals(formacaoAcademica.getNivel())) {
			formacaoAcademica.setEm(emOutros);
		}
		
		for (SelectItem si : lsPais) {
			if (si.getValue().equals(formacaoAcademica.getIdPais()))
				formacaoAcademica.setPais(si.getLabel());
		}
		
		if ("36".equals(formacaoAcademica.getIdPais())) { //brasil
			for (SelectItem si : lsMunicipio) {
				if (si.getValue().equals(formacaoAcademica.getCodIbge()))
					formacaoAcademica.setCidade(si.getLabel());
			}
		} else {
			formacaoAcademica.setSiglaUf(null);
			formacaoAcademica.setCodIbge(null);
		}
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		formacaoAcademica.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.addFormacaoAcademica(formacaoAcademica);

		if (lsFormacaoAcademica == null) {
			lsFormacaoAcademica = new ArrayList<FormacaoAcademicaTitulacao>();
		}
		lsFormacaoAcademica.add(formacaoAcademica);
		formacaoAcademica = new FormacaoAcademicaTitulacao();
		sucessoAddFormacaoAcademica = true;
	}
	public void excluirFormacaoAcademica() {
		int index = Integer.parseInt(UtilJSF.getParameter("index"));
		FormacaoAcademicaTitulacao fat = lsFormacaoAcademica.get(index);

		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		formacaoAcademica.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.excluirFormacaoAcademica(fat.getIdFormacaoAcademicaTitulacao());

		lsFormacaoAcademica.remove(index);
	}
	
	public void addFormacaoComplementar() {
		for (SelectItem si : lsPais) {
			if (si.getValue().equals(formacaoComplementar.getIdPais()))
				formacaoComplementar.setPais(si.getLabel());
		}
		
		if ("36".equals(formacaoComplementar.getIdPais())) { //brasil
			for (SelectItem si : lsMunicipioFc) {
				if (si.getValue().equals(formacaoComplementar.getCodIbge()))
					formacaoComplementar.setCidade(si.getLabel());
			}
		} else {
			formacaoComplementar.setSiglaUf(null);
			formacaoComplementar.setCodIbge(null);
		}
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		formacaoComplementar.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.addFormacaoComplementar(formacaoComplementar);
		
		if (lsFormacaoComplementar == null) {
			lsFormacaoComplementar = new ArrayList<FormacaoComplementar>();
		}
		lsFormacaoComplementar.add(formacaoComplementar);
		formacaoComplementar = new FormacaoComplementar();
		sucessoAddFormacaoComplementar = true;
	}
	public void excluirFormacaoComplementar() {
		int index = Integer.parseInt(UtilJSF.getParameter("index"));
		FormacaoComplementar fc = lsFormacaoComplementar.get(index);
		
		IManterProfissional mp = (IManterProfissional) UtilSpring
				.getBean(IManterProfissional.NOME);
		formacaoComplementar.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.excluirFormacaoComplementar(fc.getIdFormacaoComplementar());
		
		lsFormacaoComplementar.remove(index);
	}
	
	public void addParticipacaoEvento() {
		for (SelectItem si : lsPais) {
			if (si.getValue().equals(participacaoEvento.getIdPais()))
				participacaoEvento.setPais(si.getLabel());
		}
		
		if ("36".equals(participacaoEvento.getIdPais())) { //brasil
			for (SelectItem si : lsMunicipioPe) {
				if (si.getValue().equals(participacaoEvento.getCodIbge()))
					participacaoEvento.setCidade(si.getLabel());
			}
		} else {
			participacaoEvento.setSiglaUf(null);
			participacaoEvento.setCodIbge(null);
		}
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		participacaoEvento.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.addParticipacaoEvento(participacaoEvento);
		
		if (lsParticipacaoEvento == null) {
			lsParticipacaoEvento = new ArrayList<ParticipacaoEvento>();
		}
		lsParticipacaoEvento.add(participacaoEvento);
		participacaoEvento = new ParticipacaoEvento();
		sucessoAddParticipacaoEvento = true;
	}
	public void excluirParticipacaoEvento() {
		int index = Integer.parseInt(UtilJSF.getParameter("index"));
		ParticipacaoEvento pe = lsParticipacaoEvento.get(index);
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		participacaoEvento.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.excluirParticipacaoEvento(pe.getIdParticipacaoEvento());
		
		lsParticipacaoEvento.remove(index);
	}
	
	public void addEsperienciaProfissional() {
		for (SelectItem si : lsPais) {
			if (si.getValue().equals(esperienciaProfissional.getIdPais()))
				esperienciaProfissional.setPais(si.getLabel());
		}
		
		if ("36".equals(esperienciaProfissional.getIdPais())) { //brasil
			for (SelectItem si : lsMunicipioEp) {
				if (si.getValue().equals(esperienciaProfissional.getCodIbge()))
					esperienciaProfissional.setCidade(si.getLabel());
			}
		} else {
			esperienciaProfissional.setSiglaUf(null);
			esperienciaProfissional.setCodIbge(null);
		}
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		esperienciaProfissional.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.addEsperienciaProfissional(esperienciaProfissional);
		
		if (lsEsperienciaProfissional == null) {
			lsEsperienciaProfissional = new ArrayList<EsperienciaProfissional>();
		}
		lsEsperienciaProfissional.add(esperienciaProfissional);
		esperienciaProfissional = new EsperienciaProfissional();
		sucessoAddEsperienciaProfissional = true;
	}
	public void excluirEsperienciaProfissional() {
		int index = Integer.parseInt(UtilJSF.getParameter("index"));
		EsperienciaProfissional ep = lsEsperienciaProfissional.get(index);
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		esperienciaProfissional.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.excluirEsperienciaProfissional(ep.getIdEsperienciaProfissional());
		
		lsEsperienciaProfissional.remove(index);
	}
	
	public void addLinguaEstrangeira() {
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		linguaEstrangeira.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.addLinguaEstrangeira(linguaEstrangeira);
		
		if (lsLinguaEstrangeira == null) {
			lsLinguaEstrangeira = new ArrayList<LinguaEstrangeira>();
		}
		lsLinguaEstrangeira.add(linguaEstrangeira);
		linguaEstrangeira = new LinguaEstrangeira();
		sucessoAddLinguaEstrangeira = true;
	}
	public void excluirLinguaEstrangeira() {
		int index = Integer.parseInt(UtilJSF.getParameter("index"));
		LinguaEstrangeira le = lsLinguaEstrangeira.get(index);
		
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		linguaEstrangeira.setIdUsuarioProfissional(this.idUsuarioProfissional);
		mp.excluirLinguaEstrangeira(le.getIdLinguaEstrangeira());
		
		lsLinguaEstrangeira.remove(index);
	}

	public void onchangeConhecimentoMsexcel(AjaxBehaviorEvent event) {
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		mp.alterarConhecimentoInformativa(idUsuarioProfissional, conhecimentoMsexcel, null, null);
	}
	public void onchangeConhecimentoMspowerpoint(AjaxBehaviorEvent event) {
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		mp.alterarConhecimentoInformativa(idUsuarioProfissional, null, conhecimentoMspowerpoint, null);
	}
	public void onchangeConhecimentoMsword(AjaxBehaviorEvent event) {
		IManterProfissional mp = (IManterProfissional) UtilSpring.getBean(IManterProfissional.NOME);
		mp.alterarConhecimentoInformativa(idUsuarioProfissional, null, null, conhecimentoMsword);
	}

	public FormacaoAcademicaTitulacao getFormacaoAcademica() {
		return formacaoAcademica;
	}

	public void setFormacaoAcademica(
			FormacaoAcademicaTitulacao formacaoAcademica) {
		this.formacaoAcademica = formacaoAcademica;
	}

	public FormacaoComplementar getFormacaoComplementar() {
		return formacaoComplementar;
	}

	public void setFormacaoComplementar(
			FormacaoComplementar formacaoComplementar) {
		this.formacaoComplementar = formacaoComplementar;
	}

	public ParticipacaoEvento getParticipacaoEvento() {
		return participacaoEvento;
	}

	public void setParticipacaoEvento(ParticipacaoEvento participacaoEvento) {
		this.participacaoEvento = participacaoEvento;
	}

	public LinguaEstrangeira getLinguaEstrangeira() {
		return linguaEstrangeira;
	}

	public void setLinguaEstrangeira(LinguaEstrangeira linguaEstrangeira) {
		this.linguaEstrangeira = linguaEstrangeira;
	}

	public EsperienciaProfissional getEsperienciaProfissional() {
		return esperienciaProfissional;
	}

	public void setEsperienciaProfissional(
			EsperienciaProfissional esperienciaProfissional) {
		this.esperienciaProfissional = esperienciaProfissional;
	}

	public List<FormacaoAcademicaTitulacao> getLsFormacaoAcademica() {
		return lsFormacaoAcademica;
	}

	public void setLsFormacaoAcademica(
			List<FormacaoAcademicaTitulacao> lsFormacaoAcademica) {
		this.lsFormacaoAcademica = lsFormacaoAcademica;
	}

	public List<FormacaoComplementar> getLsFormacaoComplementar() {
		return lsFormacaoComplementar;
	}

	public void setLsFormacaoComplementar(
			List<FormacaoComplementar> lsFormacaoComplementar) {
		this.lsFormacaoComplementar = lsFormacaoComplementar;
	}

	public List<ParticipacaoEvento> getLsParticipacaoEvento() {
		return lsParticipacaoEvento;
	}

	public void setLsParticipacaoEvento(
			List<ParticipacaoEvento> lsParticipacaoEvento) {
		this.lsParticipacaoEvento = lsParticipacaoEvento;
	}

	public List<LinguaEstrangeira> getLsLinguaEstrangeira() {
		return lsLinguaEstrangeira;
	}

	public void setLsLinguaEstrangeira(
			List<LinguaEstrangeira> lsLinguaEstrangeira) {
		this.lsLinguaEstrangeira = lsLinguaEstrangeira;
	}

	public List<EsperienciaProfissional> getLsEsperienciaProfissional() {
		return lsEsperienciaProfissional;
	}

	public void setLsEsperienciaProfissional(
			List<EsperienciaProfissional> lsEsperienciaProfissional) {
		this.lsEsperienciaProfissional = lsEsperienciaProfissional;
	}

	public List<SelectItem> getLsUf() {
		return lsUf;
	}

	public void setLsUf(List<SelectItem> lsUf) {
		this.lsUf = lsUf;
	}

	public List<SelectItem> getLsMunicipio() {
		return lsMunicipio;
	}

	public void setLsMunicipio(List<SelectItem> lsMunicipio) {
		this.lsMunicipio = lsMunicipio;
	}

	public Boolean getConhecimentoMsexcel() {
		return conhecimentoMsexcel;
	}

	public void setConhecimentoMsexcel(Boolean conhecimentoMsexcel) {
		this.conhecimentoMsexcel = conhecimentoMsexcel;
	}

	public Boolean getConhecimentoMspowerpoint() {
		return conhecimentoMspowerpoint;
	}

	public void setConhecimentoMspowerpoint(Boolean conhecimentoMspowerpoint) {
		this.conhecimentoMspowerpoint = conhecimentoMspowerpoint;
	}

	public Boolean getConhecimentoMsword() {
		return conhecimentoMsword;
	}

	public void setConhecimentoMsword(Boolean conhecimentoMsword) {
		this.conhecimentoMsword = conhecimentoMsword;
	}

	public boolean isSucessoAddFormacaoAcademica() {
		return sucessoAddFormacaoAcademica;
	}

	public void setSucessoAddFormacaoAcademica(boolean sucessoAddFormacaoAcademica) {
		this.sucessoAddFormacaoAcademica = sucessoAddFormacaoAcademica;
	}

	public boolean isSucessoAddFormacaoComplementar() {
		return sucessoAddFormacaoComplementar;
	}

	public void setSucessoAddFormacaoComplementar(
			boolean sucessoAddFormacaoComplementar) {
		this.sucessoAddFormacaoComplementar = sucessoAddFormacaoComplementar;
	}

	public boolean isSucessoAddParticipacaoEvento() {
		return sucessoAddParticipacaoEvento;
	}

	public void setSucessoAddParticipacaoEvento(boolean sucessoAddParticipacaoEvento) {
		this.sucessoAddParticipacaoEvento = sucessoAddParticipacaoEvento;
	}

	public boolean isSucessoAddEsperienciaProfissional() {
		return sucessoAddEsperienciaProfissional;
	}

	public void setSucessoAddEsperienciaProfissional(
			boolean sucessoAddEsperienciaProfissional) {
		this.sucessoAddEsperienciaProfissional = sucessoAddEsperienciaProfissional;
	}

	public boolean isSucessoAddLinguaEstrangeira() {
		return sucessoAddLinguaEstrangeira;
	}

	public void setSucessoAddLinguaEstrangeira(boolean sucessoAddLinguaEstrangeira) {
		this.sucessoAddLinguaEstrangeira = sucessoAddLinguaEstrangeira;
	}

	public String getEmOutros() {
		return emOutros;
	}

	public void setEmOutros(String emOutros) {
		this.emOutros = emOutros;
	}

	public List<SelectItem> getLsPais() {
		return lsPais;
	}

	public List<SelectItem> getLsMunicipioFc() {
		return lsMunicipioFc;
	}

	public List<SelectItem> getLsMunicipioPe() {
		return lsMunicipioPe;
	}

	public List<SelectItem> getLsMunicipioEp() {
		return lsMunicipioEp;
	}

}
